package my.design.iterator;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

/**
 * @author zp
 * @version 1.0
 * @description: 具体实现迭代器对象类（集合）
 * 定义迭代器接口 Iterator JDK自带的迭代器接口
 * 提供了三个方法：
 * 1、boolean hasNext();
 * 2、E next();
 * 3、default void remove() { throw new UnsupportedOperationException("remove");}
 * 4、default void forEachRemaining(Consumer<? super E> action) (提供了增强for循环的能力)
 * 第三个和第四个都是接口默认实现方法
 * 想实现迭代器方法 需要根据类型自定义迭代器实现类
 * 迭代器具体实现类：
 * ComputerCollegeIterator （默认实现数组类型的迭代器实现）
 * 自定义自己迭代器的方法实现
 * InfoColleageIterator （默认实现集合类型的迭代器实现）
 * 自定义自己迭代器的方法实现
 * 数据类型的总接口
 * College 最关键的方法
 * Iterator createIterator(); 方法获取一个迭代器对象
 * 具体的实现College接口的实现类自定义 返回的迭代器类型
 * OutPutImpl获取到迭代器 因为迭代器都是实现类Iterator接口 可以使用统一的方式遍历数据
 * 遍历数据的基本模板：
 * while(iterator.hasNext()) {
 * Department d = (Department)iterator.next();
 * System.out.println(d.getName());
 * }
 * 迭代器模式的注意事项和细节
 *         优点
 *         1) 提供一个统一的方法遍历对象，客户不用再考虑聚合的类型，使用一种方法就可以遍历对象了。
 *         2) 隐藏了聚合的内部结构，客户端要遍历聚合的时候只能取到迭代器，而不会知道聚合的具体组成。
 *         3) 提供了一种设计思想，就是一个类应该只有一个引起变化的原因（叫做 单一责任原则 ）。
 *         在聚合类中，我们把迭代器分开，就是要把管理对象集合和遍历对象集合的责任分开，
 *         这样一来集合改变的话，只影响到聚合对象。而如果遍历方式改变的话，只影响到了迭代器。
 *         4) 当要展示一组相似对象，或者遍历一组相同对象时使用 , 适合使用迭代器模式
 *         缺点
 *         每个聚合对象都要一个迭代器，会生成多个迭代器不好管理类
 *
 * @date 2022/10/24 20:36
 */

public class InfoColleageIterator implements Iterator {


    List<Department> departmentList; // 信息工程学院是以List方式存放系
    int index = -1;//索引


    public InfoColleageIterator(List<Department> departmentList) {
        this.departmentList = departmentList;
    }

    //判断list中还有没有下一个元素
    @Override
    public boolean hasNext() {
        if (index >= departmentList.size() - 1) {
            return false;
        } else {
            index += 1;
            return true;
        }

    }

    @Override
    public Object next() {
        return departmentList.get(index);
    }

    //空实现remove
    @Override
    public void remove() {
        throw new UnsupportedOperationException();
    }

}
